const xml2js = require('xml2js');
const cheerio = require('cheerio');

/**
 * 自定义HTML实体反转义函数（处理XML中常见的转义符号）
 * @param {string} str - 包含转义实体的字符串
 * @returns {string} 反转义后的字符串
 */
function decodeHtmlEntities(str) {
  return str
    .replace(/&lt;/g, '<')    // 还原 <
    .replace(/&gt;/g, '>')    // 还原 >
    .replace(/&amp;/g, '&')   // 还原 &
    .replace(/&quot;/g, '"')  // 还原 "
    .replace(/&#039;/g, "'"); // 还原 '（你的XML中存在&#039;）
}

async function parse(content) {
  try {
    // console.log(content);
    // 1. 从HTML中提取<pre>标签内的转义XML
    const $ = cheerio.load(content);
    const escapedXml = $('pre').text().trim();
    if (!escapedXml) {
      throw new Error('未从HTML中找到包含XML的<pre>标签');
    }
    console.log('原始转义XML:', escapedXml);
    // 2. 用自定义函数反转义，得到纯XML
    const pureXml = decodeHtmlEntities(escapedXml);
    console.log(pureXml);
    // 3. 解析XML
    const parser = new xml2js.Parser({
      trim: true,
      explicitArray: true,
      ignoreAttrs: true,
      strict: false // 宽容处理轻微格式问题
    });
    console.log('纯XML:', pureXml);
    // 3. 解析XML
    const parsedResult = await new Promise((resolve, reject) => {
      parser.parseString(pureXml, (err, res) => err ? reject(err) : resolve(res));
    });
    console.log('解析后的XML:', JSON.stringify(parsedResult));
    // 4. 提取结构化数据
    const items = parsedResult?.RSS?.CHANNEL?.[0]?.ITEM || [];
    const structuredData = items.map((item, idx) => ({
      title: item.TITLE?.[0] || `无标题（第${idx+1}篇）`,
      link: item.LINK?.[0] || '',
      description: item.DESCRIPTION?.[0] || '无描述',
      pubDate: item.PUBDATE?.[0] || '未知时间',
      creator: item['DC:CREATOR']?.[0] || '未知作者'
    }));
    // console.log('结构化数据:', structuredData);
    return structuredData;
    // return {
    //   success: true,
    //   data: structuredData,
    //   platform: 'phoronix',
    //   source: 'Phoronix RSS'
    // };

  } catch (err) {
    return {
      success: false,
      error: `解析失败: ${err.message}`,
      platform: 'tomshardware'
    };
  }
}

module.exports = { parse };